﻿#ifndef PIECE_H
#define PIECE_H

/*! \class Piece
 *  \brief     Classe abstrata do tipo Piece.
 *  \details   Esta classe possui as funções e propriedades basicas de cada peça.
 *             e também gerencia os eventos básicos de cada peça.
 *  \author    Ghybson
 *  \author    Luís
 *  \author    Willian
 *  \version   0.1
 *  \date      2011
 *  \copyright GNU Public License.
 */

#include <QSize>
#include <QPoint>
#include <QRect>
#include <QList>
#include <QString>
#include <QTransform>
#include <QColor>
#include <QDebug>
#include <qmath.h>

class Piece
{
public:
    /*! \fn  Piece()
     *  \brief  Construtor padrão classe abstrata \c Piece.
     */
    Piece();
    /*! \fn  Piece()
     *  \brief  Construtor padrão classe abstrata \c Piece.
     */
    ~Piece();
    /*! \fn virtual QList<QRect> Piece::rotacione()=0
     *  \brief  Função virtual pura da classe abstrata \c Piece para rotacionar as peças
     *          de cada tipo. As funções de rotação estão implemetadas nas classes
     *          derivadas de \c Piece.
     *  \return Retorna a lista de \c QList<QRect> com os retângulos da
     *          classe derivada de \c Piece rotacionados.
     */
    virtual QList<QRect> rotacione()=0;
    /*! \fn  QList<QRect> getQuadrados()
     *  \brief  Função membro pública da classe abstrata \c Piece para obter a lista
     *          de quadrados de cada peça.
     *  \return Retorna a lista \a m_Quadrados de \a QList<QRect>.
     */
    QList<QRect> getQuadrados() {return m_Quadrados;}
    /*! \fn  QRect getQuadrado(int n)
     *  \brief  Função membro pública da classe abstrata \c Piece para obter um dos
     *          quadrados de cada peça.
     *  \param[in] n Inteiro que representa o indice da lista de quadrados.
     *  \return Retorna o \a m_Quadrados[n] do tipo \a QRect que se encontra.
     */
    QRect getQuadrado(int n) {return m_Quadrados[n];}
    /*! \fn  int getQuadCount()
     *  \brief  Função membro pública da classe abstrata \c Piece para obter o número
     *          inteiro de quadrados de cada peça.
     *  \return Retorna um inteiro com o número de quadrados da lista \a m_Quadrados.
     */
    int getQuadCount() {return m_Quadrados.size();}
    /*! \fn  QColor getColor()
     *  \brief  Função membro pública da classe abstrata \c Piece para obter a propriedade
     *          de cor de cada peça.
     *  \return Retorna a propriedade \a m_Cor do tipo \a QColor.
     */
    QColor getColor(){return m_Cor;}
    /*! \fn  void setQuadrados(QList<QRect> quads)
     *  \brief  Função membro pública da classe abstrata \c Piece para modificar todos
     *          os quadrados de uma peça.
     *  \param[in] quads Lista do tipo \a QList<QRect> que modificará a lista
     *          \a m_Quadrados.
     */
    void setQuadrados(QList<QRect> quads);
    /*! \fn  void moveRight()
     *  \brief  Função membro pública da classe abstrata \c Piece para movimentar
     *          todos os quadrados de uma peça para esquerda. A movimentação é feita
     *          incrementando o valor \a s_QuadLength.width() em todas as cordenadas
     *          do eixo X de todos os quadrados do tipo \a QRect da lista
     *          \a m_Quadrados.
     */
    void moveRight();
    /*! \fn  void moveLeft()
     *  \brief  Função membro pública da classe abstrata \c Piece para movimentar
     *          todos os quadrados de uma peça para esquerda. A movimentação é feita
     *          decrementando o valor \a s_QuadLength.width() em todas as cordenadas
     *          do eixo X de todos os quadrados do tipo \a QRect da lista
     *          \a m_Quadrados.
     */
    void moveLeft();
    /*! \fn  void moveDown()
     *  \brief  Função membro pública da classe abstrata \c Piece para movimentar
     *          todos os quadrados de uma peça para baixo. A movimentação é feita
     *          incrementando o valor \a s_QuadLength.height() em todas as cordenadas
     *          do eixo Y de todos os quadrados do tipo \a QRect da lista
     *          \a m_Quadrados.
     */
    void moveDown();
    /*! \fn  void centerPieceWidth(int w)
     *  \brief  Função membro pública da classe abstrata \c Piece para centralizar
     *          o eixo horizontal de uma peça qualquer em uma janela com o valor de
     *          \a w píxeis de largura.
     *  \param[in] w inteiro que representa o valor de largura da janela
     *          onde a peça será centralizada.
     */
    void centerPieceWidth(int w);
    /*! \fn  void centerPieceHeight(int h)
     *  \brief  Função membro pública da classe abstrata \c Piece para centralizar
     *          o eixo vertical de uma peça qualquer em uma janela com o valor de
     *          \a h píxeis de altura.
     *  \param[in] h inteiro que representa o valor de altura da janela
     *          onde a peça será centralizada.
     */
    void centerPieceHeight(int h);
    /*! \fn  QSize getQuadLength()
     *  \brief  Função membro pública da classe abstrata \c Piece para obter
     *          a propriedade estática de tamanho dos quadrados de cada peça.
     *  \return Retorna a propriedade estática \a s_QuadLength do tipo \a QSize.
     */
    static QSize getQuadLength() {return s_QuadLength;}
protected:
    static const QSize s_QuadLength;    /*!< Tamanho dos quadrados de cada peça
                                         *   no formato do tipo \c QSize
                                         */
    QList<QRect> m_Quadrados;           /*!< Lista de objetos do tipo \c QRect
                                         *   que representa os quadrados de cada peça.
                                         */
    QColor m_Cor;                       /*!< propriedade de cor de cada peça
                                         *   do tipo \c QColor
                                         */
    bool m_Rot;                         /*!< Flag que indica se as peças do tipo
                                         *   \c IPiece, \c NPiece, \c NMPiece,
                                         *   devem fazer rotação de 90°, ou -90°
                                         */
    bool m_TriedRot;                    /*!< Flag que indica se as peças do tipo
                                         *   \c IPiece, \c NPiece, \c NMPiece,
                                         *   tentaram fazer uma rotação de 90°, ou -90°
                                         */
};

#endif // PIECE_H
